package com.richpay.basejava.base16;

/**
 * 自动装箱、拆箱
 * <p>
 * java提供了八大基本数据类型的包装类。
 * Q: java为什么要提供包装类？
 * A: java的八大基本数据类型都不是对象，都没有提供方法，而java是一门面向对象的语言，
 * 为了能够以对象的方式处理java的八大基本数据类型的数据，从而提供了包装类。
 * <p>
 * Q:java八大基本数据类型的包装类分别是什么?
 * A: 基本数据类型    包装类
 * byte          Byte
 * short         Short
 * int           Integer
 * long          Long
 * float         Float
 * double        Double
 * char          Character
 * boolean       Boolean
 * 通过观察上面的对应关系，发现：除了int的包装类为Integer，char的包装类为character外，其他数据类型对应的包装类都是首字母大写。
 * <p>
 * 装箱:将基本数据类型转换成对应的包装类对象的过程，基本数据类型-->包装类
 * A:通过构造方法(构造方法的形参是当前包装类对应的基本数据类)
 * B:static Integer valueOf(int i);
 * <p>
 * 拆箱:将包装类转化成对应的基本数据类型的过程，包装类-->基本数据类型
 * A:通过调用包装类对象的xxValue()完成拆箱操作，如:
 * Integer num=new Integer();//通过构造方法完成了装箱操作
 * int k=num.intValue();//通过对象.xxValue()完成了拆箱操作。
 * <p>
 * 数据类型转化:
 * A:构造方法(形参是字符串，如果想转化成功，则必须让字符串是能够转化成对应的数据类型的值，否则转化失败，报异常:NumberFormatException)
 * B:包装类对象.xxValue();xxx是基本数据类型完成数据类型转化
 * C:static int parseInt(String s);
 */
public class WrapClass {
    public static void main(String[] args) {

        /**
         * Integer
         * *****************************************
         * *****************************************/
        int max = Integer.MAX_VALUE;//得到int类型所表示的最大数值。
        System.out.println("max=" + max);//2147483647
        int min = Integer.MIN_VALUE;
        System.out.println("min=" + min);//-2147483648

        int size = Integer.SIZE;//int数据类型占用的总位数
        System.out.println("size=" + size);//32

        Class clz = Integer.TYPE;
        System.out.println("clz=" + clz);

        int i = 2;
        Integer num1 = new Integer(i);//通过构造方法完成了封箱操作。
        System.out.println("num1=" + num1);

        int j = num1.intValue();//通过包装类的xxxValue()完成了拆箱操作。

        Integer num2 = new Integer("5");//通过构造方法进行数据类型转化，参数的值必须是可以转化成目标数据类型的数据
        System.out.println("num2=" + num2);

        /**
         * 比较两个Integer类型的对象之间的关系:
         *
         * 当前对象大于与之比较对象返回1，
         * 当前对象等于与之比较对象返回0，
         * 当前对象小于与之比较对象返回-1。
         */
        int result = num1.compareTo(num2);
        System.out.println("result=" + result);

        /**
         * Byte
         * *****************************************
         * *****************************************/
        byte b = num2.byteValue();//完成了数据类型转化
        System.out.println("b=" + b);

        //static String toBinaryString(int i):将给定的进制数转化成对应的二进制字符串
        String binary = Integer.toBinaryString(10);//将十进制转化成二进制字符串
        binary = Integer.toBinaryString(010);//将八进制转化成二进制字符串
        binary = Integer.toBinaryString(0x10);//将十六进制转化成二进制字符串
        System.out.println("binary=" + binary);


        //static String toHexString(int i):将制定进制的数字转化成十六进制字符串。
        String hex = Integer.toHexString(10);
        hex = Integer.toHexString(010);
        System.out.println("hex=" + hex);

        //static String toOctalString(int i);//将给制定进制的数字转化成八进制字符串
        String octal = Integer.toOctalString(10);
        octal = Integer.toOctalString(0x10);
        System.out.println("octal=" + octal);

        String strNum = Integer.toString(10);
        System.out.println("strNum=" + strNum);

        //static String toString(int i,int radix)：将指定的数字转化成第二个参数指定的进制数对应的字符串表示形式
        String strNum2 = Integer.toString(10, 2);//十进制转二进制
        strNum2 = Integer.toString(10, 8);//十进制转八进制
        strNum2 = Integer.toString(10, 16);//十进制转十六进制
        System.out.println("strNum2=" + strNum2);

        //static Integer value(int i)
        Integer num4 = Integer.valueOf(10);//装箱
        System.out.println("num4=" + num4);

    }
}
